import os

from django.shortcuts import render
from django.views import View
from django.http import JsonResponse

from alipay import AliPay

from meiduo_mall.utils.views import LoginRequiredJSONMixin
from meiduo_mall.utils.configer import ConfigObj
from orders.models import OrderInfo
from .models import Payment


class PaymentView(LoginRequiredJSONMixin, View):
    """订单支付接口"""

    def get(self, request, order_id):

        user = request.user

        # 业务处理  -->  调用支付宝sdk来构建扫码页面链接参数
        # 1. 实例化Alipay对象
        alipay = AliPay(
            appid=ConfigObj.get('config', 'ALIPAY_APPID'),
            app_notify_url=None,  # 支付成功之后阿里服务器主动请求的美多商城链接
            app_private_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), 'keys/app_private_key.pem'),
            alipay_public_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), 'keys/alipay_public_key.pem'),
            # sign_type='RSA2',  # 加密算法
            debug=ConfigObj.get('config', 'ALIPAY_DEBUG')
        )

        order = OrderInfo.objects.get(pk=order_id)

        # 2. 生成登录支付宝链接 --> https://openapi.alipaydev.com/gateway.do + 支付链接参数（查询字符串参数）
        order_string = alipay.api_alipay_trade_page_pay(
            out_trade_no=order_id,
            total_amount=float(order.total_amount),  # Decimal转化为普通的float类型
            subject="美多商城订单：%s" % order_id,
            return_url=ConfigObj.get('config', 'ALIPAY_RETURN_URL'),
        )

        alipay_url = ConfigObj.get('config', 'ALIPAY_URL') + '?' + order_string

        # 构建响应
        return JsonResponse({'code': 0, 'errmsg': 'ok', 'alipay_url': alipay_url}, json_dumps_params={'ensure_ascii': False})


class PaymentStatusView(View):
    """保存订单支付结果接口"""

    def put(self, request):

        # 查询字符串参数在django中提取的是QueryDict类型，支付宝后续接口要求传入普通字典，所以转化为字典
        data = request.GET.dict()  # 使用QueryDict.dict()函数转化字典时，只保留一个value
        sign = data.pop('sign')  # 把sign签名数据提取出来，并从原字典中删除

        # 校验参数
        # 1. 获取alipay对象
        alipay = AliPay(
            appid=ConfigObj.get('config', 'ALIPAY_APPID'),
            app_notify_url=None,  # 支付成功之后阿里服务器主动请求的美多商城链接
            app_private_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), 'keys/app_private_key.pem'),
            alipay_public_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                                'keys/alipay_public_key.pem'),
            # sign_type='RSA2',  # 加密算法
            debug=ConfigObj.get('config', 'ALIPAY_DEBUG')
        )

        # 2. 校验支付数据
        if not alipay.verify(data, sign):
            return JsonResponse({'code': 400, 'errmsg': '支付数据验证失败'}, json_dumps_params={'ensure_ascii': False})

        # 3.1 提取订单信息
        order_id = data.get('out_trade_no')  # 美多商城订单号
        trade_id = data.get('trade_no')  # 支付宝订单号

        # 3.2 新建支付订单
        Payment.objects.create(order_id=order_id, trade_id=trade_id)

        # 3.3 修改美多商城订单状态
        order = OrderInfo.objects.get(pk=order_id)
        order.status = OrderInfo.ORDER_STATUS_ENUM['UNSEND']
        order.save()

        return JsonResponse({'code': 0, 'errmsg': 'ok', 'trade_id': trade_id}, json_dumps_params={'ensure_ascii': False})









